ML }  X c0C)HCCH Mhhݩh `eCDiCD`  RyHP   * 1H0芢@) Y0.Ș` i #(PMR\ \b Pgi 0  % @ / ՠ`d   0DDԝLyDN@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     } YS S0 i`΢ϣ߳H J3xj2h} 1 |9 ӭ45(420 * (0241өX.`  R *i)Lvw  ~*P}E 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 }q p h   j 8no CDLQ CFl M  LO Ri)Llk2'")*F }$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")")k }$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R 8 ELO Ri)^>jf | NrC s } ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p qEh }jlrs`LQ:$ȱ$@+[_#{ 8  Խut! ai 8   E I   ] C } H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ}/  [ /Lj0?MoLn FjMqLp NklLOLQnLoMlNLO R"(+}ըHH`Q R!!  % !   / .   FȑF! /GF \H"+0+* }! F tLQnm: J~nTF1F  *n+)5! n (, n)1JJJn(n*o} I ,0  ci a oF? @ , 8,0 ʩ0H Eh   i}  D ]DmmFLQvtu`*&!*@h ] 0 ^0` c 0l$$%}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h}`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H H  I9  9 } Nd EH  Q8 o n  FnoL HII/ Ih8`h`Lnon`no`u F }E VEhLO/luF l0BF/lɜɛ׽hE N  b VFL FREE SECTORS C} H) *Fh ):FȽ F FC IH' 0 d  i:Fȩ/F.l`CD/08HDIC}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ 2. ? [_{ ,0}-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C ?( 0(C.` E } R =! .ti S0N EE D XC )0')AY  )ע ? 0E088FG \o}n  (HhLcL3 iJ i Lqp 0=rspnqopqlk`jZj0  j FL`H}FhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G0i 0 FJJh1FqȱFpȱFk`B!}08`hEE D 8. =D}tui( TʩL`b!)    cȌaȌd b`aab}H8 hdaHcd8 cH hHH  \h hc` =Hh I8ih( t  ( t(!` L\}CJfCJfCJfCDfC` a  HII  INdh  `h  `n)8jHniPoijIjFIjFIjh` a } I 38  8H0 I  ' H LQ8j Y  8j NdY  &I &I &IHeH.p!}Iiq  `!.莿 2Jjj }.m Ȉ!m FG` ɩLQ z "} e Hi04 \ Ȍ  8 i h !`I0 `C Y8.`DOS SYS#} I  ` ~ݩ.C/`ba.m۩mѤC9 `C L] H  ,- '0 l $}, BLVDE`D1:AUTORUN.SYS8hhJ ȱHȱIȱBȱDȱEeeHHLV)  %}1*  ,,p-  0 I &  '0   Lw)l, 0  I&LD1:MEM.SAV&}E:D1:DUP.SYS²t>hɔ+X"+"Ȕ) :S"ʼn Z8 2.\8H  '} D  C D     )16CS S)  C)D1 p p (}0 C9DI pCDL~CiCDiD` DD˙` d J)L !)}D L(( LL()  L| L( S LH 0p n  *} CY?  q  L L  ` )+} `A! d߰")-݆ "  $G@LLL&0") $G%,}H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0-})8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH).}  hyhyB q L> Lm JJ  Ln*` dB%'/}8  H H` 1 { LL   !L     Hh SY?  q  1L0}  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L1}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@2}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q3} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF 4} G) *Gȩ GȽG GȌd q q G`  8   0G  `D5}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y6}`piH n0)բY? 08`0 7}  0$L GGȽG L `8L`L8}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`9}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE:} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR;}1LJ舩9GIH`LJJ`HGHh l`<} S gL   8 rii `дCDCG W  =}C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}>} HE |||||DOS DOSDOS SYS }?}}@}CDOS SYSA} 0`BDELV !B B}`LVUQ   ]   TU J ]L!T  #      TU C} L ? .  t`GBJ V~DEHI B V0dVD}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEhE}DEL8HI   0 HI,0 0  9 .G VLOF},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHIG} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHIH} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO I}STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -J}LLu DEHILV 9 .l 9 .l  `` s$B VBHK}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVLL}1 3u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2eM}1i1232435ޥ<<8}`ADSTARADENADCUBASIC RECOO}VERY PROGRAMby BOB FINE May 5, 1983SAVE PRIOR TO USECALL WITH [ A=USR(1536) ]&&Each line of data has P}16 numbers  A#6--"A6%#6-%@- @ d B<<104,165,128,133,0,16Q}5,129,133,1,230,1,162,16,169,3,1577766,3,169,251,157,68,3,169,6,157,69,3,169,4,157,74883,169,128,157,75,3,32,86,228,4R}8,75,160,0,140,255,68832,207,6,48,65,72,32,207,6,48,59,170,104,172,255,6??24,101,128,153,128,0,200,138,101,129,153,12S}8,0,200,192,14DD208,219,165,140,133,142,133,144,133,14,165,141,133,143,133,145$77133,15,32,207,6,48,15,160,0,145,0,230T},0,166,0,208.882,230,1,76,98,6,192,136,240,22,162,0,142,255,6,1898<<218,6,32,164,246,174,255,6,232,224,11,208,239,76,16U}3,6B<<162,0,142,255,6,189,229,6,32,164,246,174,255,6,232,224L;;10,208,239,162,16,169,12,157,66,3,32,86,228,162,0,142VV}==255,6,189,238,6,32,164,246,174,255,6,232,224,14,208,239`@@174,252,2,224,255,240,249,169,255,141,252,2,76,116,228,162jW}6616,169,7,157,66,3,32,86,228,96,73,78,67,79,77,80t7776,69,84,69,155,67,79,77,80,76,69,84,69,155,80,82~5569,83,83,32,8X}2,69,84,85,82,78,155,67,58,155,0,0D2:RECOVERY.BAS6,69,84,69,155,67,79,77,80,76,69,84,69,155,80,82~5569,83,83,32,8:sXDYDPP@@ Z}d- Bounce rev 2.2n- by Joel Gluck / June'83x A`- INIT A- DRAW Ap- BOUNCE[} A0- INITIALIZE9@,9@,-@@" 68,-68,- 1,1,1,-1\},1,0,0,0-1,1,-1,-1,-1,0,0,00,1,0,-1,0,0 +@AR@Q0@70@@ ]}@Q0@6-@@6-@$g @,1/@yC/@y^}@9U/@9g/$ - DRAW"0@@@,%(%(* Use stick to draw wall_}s,6 (* Hold trigger to erase,@""(* Hit ESC to clear screen,J(* Hit SPACE to bounce.T @,^6`}-R:,h-F:Ad,"@3*AdAU-$r>F:Ad,"@(*AdAU4 A0> A|a}@A' 1@&,' AP 6-8,6-8,==% @)%!@x)% @)%!@8b}APII2+A&&,$T:,@%@$T:,@@$T:,, 6-%c}6-% @,/%2/ AP- BOUNCE%( ("(* Hit SPACE to draw.%d}(7 @,6-@+6-@76--F:Ad,"@3*AdAU-$c1%% @e}%@+,36-%;6-%E@K,Y6-%@c Aq/2$@%@ @@91f}%C1%e2q6- !@6-6 Ap !@6-6 Ag}&)F:B7p,!A'6-6) A0 6-6 A: !@6-6 AD5 @,6-%%h}@+,5 AN !@6-6 AX5 @,6-%%@+,5 A D2:BOUNCEi}.BAS+,5 AN !@6-6 AX5 @,6-%%@+,5 A D2:BOUNCENUMBE !"@ ONE! @!"@ TWO! @(#"@ THRE k}E# @21' NUMBER NOT 1, 2 OR 3--TRY AGAIN1 @D2:BTRAIN5.BAS TWO! @(#"@ THRE SNUMBE '' ENTER A NUMBER FROM 100 TO 1999 A@(!A@2$$m}  THE NUMBER  IS IN RANGE< @D2:BTRAIN7.BAS A@(!A@2$$CNUMBE '' ENTER A NUMBER FROM 100 TO 1999!! A)!A@($$  THE NUMBERo}  IS IN RANGE2 @D2:BTRAIN8.BASM 100 TO 1999!! A)!A@($$  THE NUMBER6NUMBE '' ENTER A NUMBER FROM 100 TO 1999:A*A:  THE NUMBER  IS Iq}N RANGE( @D2:BTRAIN10.BASNUMBER FROM 100 TO 1999:A*A:  THE NUMBER  IS I,NUMBE  WHAT DO YOU WANT TO DO?   1. CALCULATE 2+2(  2. SAY 'HELLO'2 s} 3. DO NOTHING< F!! ENTER THE NUMBER YOU WANTP AND PRESS RETURN.Zd"@An"@t}A x"@A0 OOPS -- TRY AGAIN!  @ 2+2 = 4 @ HELLO! u}@ O.K. @D2:BTRAIN12.BASN!  @ 2+2 = 4 @ HELLO! 7czNUMBE  WHAT DO YOU WANT TO DO?   1. CALCULATE 2+2(  2. SAY 'HELLO'2  w} 3. DO NOTHING< F!! ENTER THE NUMBER YOU WANTP AND PRESS RETURN.ZdAA A0n  x}OOPS -- TRY AGAIN!x  @ 2+2 = 4 @ HELLO! @ O.K. @ y}D2:BTRAIN13.BASN!x  @ 2+2 = 4 @ HELLO! @ O.K. @ &'8 9KCPOPOSPCPOSMOVC1CCCC2CC1C20LTLTCPLMRMRCHALCHALCADDCCSC13SCRTPOC0SSCR${}EENC10KEYKEYSC14SC1SC1ASC1BC9C15TEMPSC2SC2ASC2BC3P1P2C5MMC4ARAMTOCHBAC25PAGC75DLDLC26C14C2$|}8C27SSSC28C25C65C65C76PL1PL2FILLF1F1F2F2$}} $~} !"#$%&'$}()@*+,-./0123456$}789:;<=>?@ABCDEF$}GHIJKLMNOPQRSTUV$}WXYZ[\]^>>KNIGHTS AND CHALICES<<>> by Bruce Willard $} << A0! 6-6-"6-!6-( 6-2& 6-R:," A`& @P<MM6-%+ ,&$+!*$} @,%+")")"@,$&$+")")"@,A %@$F @PP" (*6-6-&" AZ $}*6-6-&d*@n 6-(x ) A%@@w @0D6-F:@,!A(,$}6-&A(8@DB7t$(#A%$+(,%$"(#A86-%+,$%-6 "&82$}A%$3 - 2(-$H:,%, 0 3$34,68,13668,34,17! 6-&%! )!%A`$}+++&,'"P:+&,',*'"P:',A`++'"P:',*+&,'"P:+&,',A`%6-@:7,,%*AAp$}H 6-( 67<,.>:A$,)6-R:,4"*T:,> A`H A@" (T:, A'" @67<,.6-$}$! 6-&%! )!%A`"+++&,'"P:+&,',*'"P:',A`,++'"P:',*+&,'"P:+&,',A`6$}%6-@:7,,%*A)Ap@H 6-( 67<,.>:A)$,)6-R:,4"*T:,> A`H A J" (T:, A$}'" @T67<,.6-$h1-62 -$ ( .6-1$r96-@:7,,9+@")@X$},*@$A|%68,-(8,% A%$%8,$! -2-! / 2- #2$}+-/  2-   ' @36-@:7,,3**+"A)"A,A336-@:7,,3$}**+"AA)"AB,A3 A`"6-%$8,"@:7,,A08,A 867<,."67<,.>:$}A,(6-567<%,.8$867<,."67<,.>:A,(6-567<%,.8$@:7,,AA`? 6-$} A@-/67<,.>:A,?2@&6 - 2&'(67<,., 6 A0@:7,,A$}A:C A@-)67<,.>:A,92@C APD% -%@:7,,"@:7,,AN @$}:7,,"AXAAAAAAApApAAAAA$}AApApApApA Ab$"6-%$8,"@:7,,A08,A 867$}<,."67<,.>:A),(6-567<%,.8$867<,."67<,.>:A),(6-567<%,.8$@:7,,AC$}A`E 6- A`-/67<,.>:AC,E2A@6 - 2&'(67<,., 6 A$}@:7,,ADAI A`-)67<,.>:AD,?2A @I AP % -%@:7$},,"@:7,,A @:7,,"A $* 6-&'"P:', 6-%4A67<,.7,%67<,.>:AS,-$}-9#A %A->3"%$@%%+2$@/ 3 C"-6#A %"-H7"%$@$}%%%2%) - 7-R""(*@:7,,"@:7%,,A\!!*@:7,,"@:7%,,AfA  A%$}$%8,$)6-%$+(,36-%$A A%$pD-6"2O:,&O:,'4B7hA)8 DB7hzA6$}7<,. 67<,.7,767AP<Ay,.A A767<,.67<,.7,-67<@9,.7 A0,0,0,0,0,$}0,0,00,0,0,2,2,0,0,00,0,4,6,6,0,0,00,0,12,14,6,8,0,00,16,12,30,6,24,0,00,48,12,62,6,24,32,0$}64,48,12,126,6,88,32,64192,48,12,254,6,88,160,64867<,.7,6--) A`- 86-%+(,F-A$}@602+A&,'BB7h@eF --@)2A%@&- @ -@+*@:7$},,"AD,)+(*@:7,,"A,APQ 6-%+",6-%0 A%$%$8,Q6-8,$@C%+(8,,$@$} A%$A67<,.7,,67AP<Ay,.767<,.A A$767<,.7,"67<@9,.-67<,.$}7 A.A67<,.7,-/2%@&'=2&'A 826-%$+(,6-%$/ A%$%$8,2$$}B#67<,.>:,-##AG/ -"%$%+2@/ L7 -"%@%/2@$}3 7 V8 -2@ *-6428 ` *(8,67<,.j *8,67<,.t(*($}8,67<,.~ (*8,67<,.:6-%+$,%++(,$,&%67<,.: A%$%$8,I6-8,$%+(8,,$$}"6-,6-%&@67<,.>:A),F6-I$0 6-6-%&'67<,.>:A,-6-0$160,78,170,64,174,74? $}-2'%67<,.7,--1 ?2&':67<,.-  , A@%$: A%$> -$}67<,.]#-6-21 >67<,.[' -2  '-**+*@:7,,",)+(*@:7,,",$}A`, 67<,.6-%$+(,)6-%$,$8 --6&2@* . 82A67<,.$} 67<,.7,767AP<Ay,.A A767<,.67<,.7,-67<@9,.7 A : --6$}(2$@, :67<,.>:,-6>2$67<,. " 0 A@%$> A%$/67<,.>$}:@%, -6)6-O:,/6-([#A`%&-6A A`/6-O:,A2@$[2%@@$$}2G"%$@%%!6-%% ) 32=2AG6-<1 #A#-"-%$+%+",,%1 A $}A@%$(6-F A%$P129,0,0,0,0,0,0,129Q129,66,0,0,0,0,66,129R0,66,38,0,0,38,66,0S0,0$},38,24,24,38,0,0T0,0,0,24,24,0,0,0U0,0,0,0,0,0,0,0>6-@X#67<,.>:A,.67<,.;67<%,.>$$}>6-@C#67<,.>:A,.67<,.;67<%,.>$>6-@X#67<,.>:A),.67<,.;67<%,.>$>$}6-@C#67<,.>:A),.67<,.;67<%,.>$ -@:7,, $067<,.7,"67<@9,.-6$}7<,.0$ -@:7,, $"667<,.7,(67AP<Ay,.367<,.6$@67<,.7,6-$J$}67<,.7,6-$T67<,.7,6-$^67<,.7,6-$8+@%+", A@#-8( Π٠$}3 00@!0)03 A 0; ;,6-F:A,&'A-6-56-$;6-) #A U$}-"%67,.>:,) 6-?:C:,<<,- #A!-!"@-6-@# -"%$% $}# SS104,104,133,207,104,133,206,104,104,133,212,169,0,133,204,169,224,133,205,162 PP1,160,0,177,204,145,206,200,208$},249,230,205,230,207,232,228,212,208,240,96  )!6-F:A`,%$F:Aa,%)6-%  ( $*ALT CHAR SET4$}!!0,18,20,155,125,125,124,136>!!0,18,20,155,125,125,124,136H44,68,140,252,76,44,18,99R!!0,60,126,235,175,219,118,$}60\122,205,206,15,23,5,1,62f!!56,126,251,95,238,126,24,24p!!60,126,247,255,106,60,24,24z0,255,60,126,60,24,24$},60127,85,127,62,28,8,8,6264,174,74,0,126,14,62,127##146,243,243,97,97,115,127,127$$73,207,207,134,134,20$}6,254,254##127,126,124,116,116,84,84,127 254,126,62,46,46,42,42,2540,96,191,149,208,96,0,0 32,16,146,127,$}146,16,16,320,64,32,255,32,64,0,00,24,102,177,48,32,0,00,0,32,48,177,102,24,00,3,7,13,25,255,5,1$}0,255,66,66,66,255,66,66 ##0,192,224,176,152,255,160,128 0,0,0,0,0,0,0,0 ##60,126,255,255,255,255,126,60$ 195$},153,126,60,24,24,36,66. 146,40,68,130,68,40,146,08 !!24,60,126,153,219,36,66,129B 129,66,36,24,24,36,36,24L 0,$}72,40,217,190,190,62,17` # -#(PREPARE FOR BATTLEj K 6.67A,.!67,.'6.-6.36.96.E6-@a$}K6-t 67A!,.+.)'(43-67A),.!.$E67A3,.#(!,)#%3i67@A,.TUTUTUTUTUTUTUTUTUTU67A$},.7@A,~ s'67AA,.UTUTUTUTUTUTUTUTUTUT?67A,.7AA,L6.]67@,.s67AA,.$} 67AH,.>:AF, - ;6-P:$H:,%,)6-P:$H:,%@p,;@:7,,A$P 67<,.>:, ;6-P$}:$H:,%,)6-P:$H:,%@p,;@:7,,A$p 67<,.>:, ;6-P:$H:,%,)6-P:$H:,%@p,;@:7,,A$$} 67<,.>:, ;6-P:$H:,%,)6-P:$H:,%@p,;@:7,,A% i67<,.>:, '67@!,.967@A$},.Q67@!,.>:A9,i67@",.>:A@, c67@A,.>:AA,367@B,.>:AB,K67@Y,.>:$}@",c67@`,.>:@#, 67@A,.>:@#,367@B,.>:@$,B67@C,.b67@Y<@`,.7@Y$},67@A<@C,.7@A, T 6-6-#67<,.>:@(,767<,.>:@(,K67<,.>:@(,T67,. $}67<,.>:@(,) $ S67@<,.67<,.067@<,.;67<,.G6-@S6-@ A67<,.>:$}A,+67<,.>:A,667<,.A67<,. 67<%,.67<%,. c67@X<@X,.]567@X<@X$},.]L67@X<@X,.c67@X<@X,. I #A(P-@"+67,.>:,/ =-@C"I6-$}( )6-P:$H:,%,)")@:7,,A&2 67<,.7,< )6-P:$H:,%,)")@:7,,A& F &67<,.7,(6$}-& A&P  "6-6-Z )6-P:$H:,%,)")@:7,,A&Pd 67<,.7,n )6-P:$H:,%,)")@:7,,$}A&px &67<,.7,(6-& A&P   -6-P:$H:,%,-")")@:7,,A' 67<,.>:A, -$}6-P:$H:,%,-")")@:7,,A'  67<,.>:AC, - -6-P:$H:,%,-")")@:7,,A'P $}67<,.>:A, -6-P:$H:,%,-")")@:7,,A'p 67<,.>:AD,  )6-P:$H:,%,)")@:7,,$}A' 67<,.>:, )6-P:$H:,%,)")@:7,,A( 67<,.>:, - 6-C:,6-P:',!6-&$'-$} "67&<&,.]"67<,.>:," FF133,197,69,5,131,195,132,132,10,10,147,211,83,19,218,218,218,218, %6-P:$H:,%,$}%@:7,,A(`6 H67<,.>:,!6-P:$H:,%,)6-&/!:(@:7,,H67<,.7,@ 06-%@! "(@:7,,0$}67<,.7,J 0 6-&!AY"(@:7,,067<,.7,T %6-P:$H:,%,%@:7,,A)^ H67<,.>:,!6-P:$H:$},%,)6-&/!:(@:7,,H67<,.7,h 06-%@! "(@:7,,067<,.7,r 0 6-&!AY"(@:7,$},067<,.7,| @0 6-6-@*6-@66-@B6-@N6-@Z6-@f6-@$}r6-@~6-@ 6-@6-@ 6-@06-@@6-A@ K6-A6-AU'6-AV$}36-AA?6-AK6-Aa 6-@6-@P'6-AP36-AV?6-A9K6-AyW6-A$}c6-AVo6-AW{6-Ad6-@6-A + A@ fA!AAH-AR3$}?@P( INITIALIZINGZ A `6-f6- e;@,6-C:,J6-+@&++'A@,&P:'A@,,,$A@$}V Ae;%@, 88;A,;,;,;,;,;,;,;,;, (6. 67,.>:,(6.>:$}, J;,;,9,68,-&68,-,6.567,.>67,.D6.J(} :;,;,-6 -,(7<,6 A$}`:  F-@-#(7<,- A`1 =-@F(  '6. and '67@,.>:, :$}-@6-,(7<@,6 A`:  X-@@-5(7@<@,? A`C O-@$}X(  .6. CHALICES .67@,.>:, :-@6-,(7<@,6 A`: & " $}A`-@"( 0 D&6. BY BRUCE WILLARD >67@),.>:@4,D6-: =-@)6 $}/(7<@),9 A`= D Q ((PRESS 1 FOR 1 PLAYER.:@Q(OR 2 FOR 2 PLAYERSN $}K:X * ) @I)! * A1`b 6-&@Hl ( (}"(PLAYER 1(q ( LOR$}D OR LADY v   (}{ ' ( AND YOUR NAME!' H67,.-B:,767<,.>:@:7,,$}%A`,; H67<,.  "A2P ( (}"(PLAYER 2( ( LORD OR LADY   $} (} ' ( AND YOUR NAME!' A67,.!-@B:,=67<,.>:@:7,,%A(,A  !6$}7<,.>:A(,! A  %A%+@% A@ ; 00@!0)05A$;-$} $(CONGRATULATIONS$6. F6-@&B:,6-P:',%-,(2"< A4F A3` Y -( you $}bested'-@<( your opponentH-@Y( the realm  -( salutes you B -#(ANOTHER CHAL$}LENGE?/-@"<((Y/N)B*  6-F:,"A3p4  "@5>  %H 3 6-&6-F:A6, -$}3( HIGH SCORE:R G !A6 -B:,4A7%@:7,,8 GA7B:,\ Q -!(thy score was $}--@E(thy coat of armsQ-@f -(is a  #(lion- A4p #  (kangaroo# A4$}z   (goat A4   (duck A4 (snail F6-F:A6,!6-F:A7,)-B$}67<,.>:F:A7%,,F  =6-@&6-P:',(-@:(7<, =$D2:KNIGHTS.BAS,)-B$o+,DATHEXLINDATLIDDBYTPASCHKSUTOTA@(} *** MUSIC SYNTHESIZER *** 990,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15r;(}@,9@",/-@"3"<68,-@ L6-A V#A` @`r( CHECKING DATA86-%@((}LINE:!"8B:,@AF%6-F:A,%F:A,$AV+C(LINE  MISSING!Fq-@@(}@56-@:7<,,&@H[6-@:7%@<%@,,&@Hq6-8,$@%8,#."@*@ (}$". @%(% 6-%!A %6-&A-  ""@%2 A< F:A,@Ad(}J( WRITING FILE 6-@,6-A 6#A@ @`J @%n(BAD DATA: LINE ddD820E22020A32120A326(}4C3C25A230A97F9D4403A9289D450320B2263028A9079D4203A9009D4403A92B9D4503,888ddA9009D4803A92A9D49032056E4C088D008A90C9D42034(}C56E484D4208C26A2BAA027209624A230203E2068684C,359ccC521A90085A0A02B84A1A8B1A0C9AAD035C8D002E6A1B1A0300AAA9480A5A195814C8D(}20A90385A0B1A00A0A0A,11cc85C1A90085A0C8D002E6A1B1A0C9FFF008C8D0F2E6A14C8D20C8D002E6A1B1A0C9FFD0BAA206BDDA2085A6A92A,36(}dd85A7A9FFA00191A688B59485A0B59585A1F00EB1A091A6C8B1A091A6C8C9FFD0F2CACA10D460002A402A802AC0,708dd2AA21BA9009580CA10FB60(}A203A90685A8B5B9F031C902D0034C3123202F21C907B01FA8B9152185A6B91C2185,432$ddA7202F216CA600F245549D8EF29720212121212021A9009(}5B9CA8A0A85A810C460FE1C06BD412185A0A92A85A1,136.ddBC1C06B1A060004080C038E9010ADE2006F0A49D1C064CF220A8B934069D0806B93E069D(}0C06B948069D1006B9,3178dd52069D1406B95C069D1806980AA8A90195B99D2C06B9800095B0B9810095B4F002F6B94CF2200A09A09D28064C,861B(}ddF2209D20064CF2209D24064CF220A9FD8D3002A9268D3102A9628DC8026020492520E22020D325200D20205C20,892Lbb4C242220C6264820482468(}C94CF016C952F0DEC94EF031C950F06BC954F049208C264CC521A59505970599059B,4VddD0034C5324A265A02720712620CD2420EC2020B1242038254(}C0A25A28FA0272071262066251006209D264C0A22,348`ddD006AAF0F5CA86B82048244CC521A5C1209024A212A027202B231006209D264C2A22D0E4AA(}F0F585C14C2422A2,368jdd1FA027202B23D0D3C90A9006209D264C4822AAF0F785A80AA8B98100D0034C5324204824A6A8BD3406209024A2,848tdd(}2CA027202B231006208C264C6A22D008AAF0F5A6A89D3406204824A6A8BD3E06209024A23AA027202B23100620,595~dd8C264C8E22D008AAF0F5A6A8)}9D3E06204824A6A8A9AE38FD48064A209024A280A027202B233006D017C9089006,188dd208C264CB2220A85AFA9AE38E5AFA6A89D4806204824A6A8B)}D5206209024A247A027202B231006208C264CE322,450ddD005A6A89D5206204824A6A8BD5C06209024A256A027202B231006208C264C0423D008AAF0)}F5A6A89D5C064C24,691dd222071264C6625A4A8BD2C06D012DE3006F0034C2721B59CD0069900D29901D2F6B0D002F6B4B59CD011A90195,804dd)}C6BD08069D0006A9A29901D295A9A900A885AE95BD9D2C06BD18069D0406B5B085A0B5B485A1B1A0C955D00B98,255dd95C6A4A89901D24C1A24C956)}D005A9244C0F24C97FD009F6B0D0ABF6B44C4A23C9FFD010A90095C6A4A89901D2,117ddA90195B94CF2204A26AE4A26AEA000C9079006E907C84CC02)}348B9012485AD68A8B9082465ADA4AE79052485AD,985ddBD2406C981B00B65ADC9259024E9244CE723297F85AFA5ADE5AFC925901369234CF823000C)}182400FF01000204,488dd0507090BA8B9D82695C2A4A89900D2F6B0D002F6B4B5B085A0B5B485A1A000949CB1A00A369C4AA8B93B249D30,276dd)}064C27210406080C10182030406080C0A227A9009D5728CA10FA60204824A278A0272071264CC521A203A006DE,941dd0406D021B5BDF00AB5C29900)}D2D6BD4C8424B5C2F00F38FD14069900D2F6BDBD18069D04068888CA10D56085D4,490ddA2ABA02720682685D520AAD920E6D8D8A0FFC8B1F3291F996) }628B1F310F460A5C185AFA90485A6A03088D0FD20,808dd1826C6A6D0F4206024C6AFD0E9602029258D08D22065E4A203A006A900959C95B095B495C6) }9D24069D20069D1C,975dd06A9019D2C0695B9A9AA9D2806A9A095A9B99500D00295B9CA888810D160A5B905BA05BB05BCD012A5B8F005C6,498 dd) }B84CE7212048242029254CC5214CFE21A206A9009D01D29D00D2CACA10F660A511D029C61120292585B8204824,988dd4CC521A209A9409D3E069D5C) }06A9019D3406A9009D5206A9A29D4806CA10E660A90085AFCE7A2820C626C99BF0,796dd39C97ED013A5AFF0F1C6AFA6AFA9FF9D7A28FE7B284C6D25A) }6AFE003F0DCC93090D8C93AB0D4A6AF9D6606E91F,478(dd9D7A28A9FF9D7B28E6AF4C6D25A6AFD003E6AF60A96685F3A90685F4A9009D660685F22000)}D820D2D9D8A5D4A6,6952ddD5F002A28060A29EA02720682685AFCE6B2820C626A6AFC97ED0108AF0F4C6AFA9FF9D6A28FE6B284CDF259D7F,793<dd)}28C99BF01538E9209D6B28A9FF9D6C28E6AFE8E011D0CE4CE825FE6B2860A203A006B5C6F042DE0006D03DC901,653FddF007C902F0204C6226F6A9B5)}A99901D2DD2806F006BD08064C4726F6C6BD0C069D00064C6226B5A9DD1006F00C,488Pdd900AD6A9B5A99901D24C4426F6C68888CA10B560A95785A4A)}9284C7726A96B85A4A92885A586A284A3A000B1A2,297ZddF01938E92091A4C84C7F26A020A27F8E1FD08E0AD4CA10F78810F260208C264C4824A22020)}3E20A9C49D4403A9,290ddd269D4503A9039D4203A9049D4A03A9009D4B034C56E44B9BA220A9009D48039D4903A9079D42034C56E4F3E6D9,696ndd)}CCC1B6ADA29990888079726C66605B55514C4844403C3935322F2D2A282523211F1D70707047CA270770700707,701xdd0707077070070741FD265445)}4D504F20312D3235353A005048524153452023312D393A0041545441434B20312D,338dd3235353A00444543415920312D3235353A00562E52414E474)}520302D3235353A00562E535045454420312D3235,816dd353A005055534820425245414B20544F2053544F50004E4F204441544100564F4C2E204452)}4F5020302D373A00,526dd5245504541545320312D3235353A00444556494345204E414D453F0043555252454E542056414C55453A00492F,352dd)}4F204552524F5220434F44453A0000006D757369630073796E74686573697A657200000000627900006B656E00,536dd636F6C6C6965720000000000)}2C697374656E000000000000000000000000000032657472696576650000000000,679dd000000000000002E756D62657200000000000000000000000)}00000306872617365006368616E67650000000000,457dd000034656D706F000000000000000000000000000000000000000000000000000000000000)}0000000000000000,942D2:SYNMAIN.BAS57dd000034656D706F000000000000000000000000000000000000000000000000000000000000(+2 REM *** CASSETTE VERSION ***65 IF PASS=2 THEN FOR X=1 TO 109:PUT #1,0:NEXT X:CLOSE #1:END 70 ? "READY CASSETTE AND PRESS -}RETURN";:OPEN #1,8,128,"C:":RESTORE 200:FOR X=1 TO 35:READ N:PUT #1,N:NEXT X200 DATA 0,18,221,31,255,31,169,60,141,2,211,169-},0,141,231,2,133,14,169,56,141,232,2210 DATA 133,15,169,0,133,10,169,32,133,11,24,960,18,221,31,255,31,169,60,141,2,211,169,V2 REM *** DISK VERSION ***65 IF PASS=2 THEN PUT #1,224:PUT #1,2:PUT #1,225:PUT #1,2:PUT #1,0:PUT #1,32:CLOSE #1:END 70 ? "I1}NSERT DISK WITH DOS, PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:SYN.OBJ"90 PUT #1,255:PUT #1,255:PUT #1,0:PUT #1,32:1 }PUT #1,111:PUT #1,40PRESS RETURN";:DIM IN$(1):INPUT IN$:OPEN #1,8,0,"D:SYN.OBJ"90 PUT #1,255:PUT #1,255:PUT #1,0:PUT #1,32:00100 ; +-------------------+0105 ; | MUSIC SYNTHESIZER |0110 ; | by Ken Collier |0115 ; +-------------------+0120 ;015"}25 ; Page Six variables.0130 ;0135 *= $06000140 ;0145 SYNCNT *= *+4 syn counter0150 VIBCNT *= *+4 vibrato count5#}er0155 ATTACK *= *+4 attack counter0160 DECAY *= *+4 decay counter0165 DROP *= *+4 minimum volume0170 VRANGE *= 5$}*+4 vibrato range0175 VSPEED *= *+4 vibrato speed0180 VCOUNT *= *+4 voice counter0185 LINECNT *= *+4 line counter05%}190 TRANSPOS *= *+4 transpose value0195 HIGHVOL *= *+4 maximum volume0200 GETNOTE *= *+4 need new note0205 DURCNT *= *+45&} duration count0210 PATTACK *= *+10 phrase attack0215 PDECAY *= *+10 phrase decay0220 PDROP *= *+10 phrase min vol025'}25 PVRANG *= *+10 phrase v.range0230 PVSPEED *= *+10 phrase v.speed0235 NMBUF *= *+4 numeric buffer0240 ;0245 ; Page 5(}Zero variables.0250 ;0255 *= $800260 ;0265 TABLE *= *+28 voices/phrases0270 TIED *= *+4 tied note flags0275 5)}PTR *= *+2 temp index0280 PINDX *= *+2 print index0285 P2NDX *= *+2 print index 20290 TMP2 *= *+2 temporary5*} 20295 XSTORE *= *+1 voice index0300 VOLNOW *= *+4 current volume0305 NOTE *= *+1 note value0310 ACCID *= *+1 5+}accidental0315 TMP *= *+1 temporary0320 PTRL *= *+4 phrase addr low0325 PTRH *= *+4 phrase addr hi0330 REPEA5,}T *= *+1 repeat music0335 STATUS *= *+4 voice status0340 VSTAT *= *+4 vibrato status0345 TEMPO *= *+1 music spee5-}d0350 VNOTE *= *+4 vibrato sound0355 SYNSTAT *= *+4 syn status0360 ;0365 FR0 = $D4 F.P. register 00370 CIX = 5.} $F2 F.P. index0375 INBUFF = $F3 F.P. buffer0380 ;0385 ; Miscellaneous labels.0390 ;0395 CIOV = $E456 CIO vect5/}or0400 SIOINV = $E465 SIO init vector0405 AFP = $D800 ASCII to F.P.0410 FASC = $D8E6 F.P. to ASCII0415 IFP = $D50}9AA INTEGER to F.P.0420 FPI = $D9D2 F.P. to INTEGER0425 ICCOM = $0342 command byte0430 ICBAL = $0344 buffer addr51} lo0435 ICBAH = $0345 buffer addr hi0440 ICBLL = $0348 buffer len lo0445 ICBLH = $0349 buffer len hi0450 ICAX1 = $052}34A aux info 10455 ICAX2 = $034B aux info 20460 OPEN = $03 open command0465 CLOSE = $0C close command0470 RE53}AD = $07 get characters0475 EOF = 136 end file flag0480 IOCB2 = $20 IOCB #2 offset0485 IOCB3 = $30 IOCB54} #3 offset0490 WSPACE = $2A00 workspace addr0495 BUFS = $2A00 buffer size0500 AUDF1 = $D200 audio freq 10505 AUDC1 55}= $D201 audio volume 10510 SDLSTL = $0230 display list0515 COLBK = $02C8 backgnd color0520 BRKKEY = $11 break key 56}flag0525 CONSOL = $D01F console speaker0530 SKCTL = $D20F serial I/O ctrl0535 AUDCTL = $D208 audio control0540 WSYNC 57}= $D40A wait for sync0545 RETURN = $9B return key0550 BACKS = $7E backspace key0555 VLEN = $40 voice buff le58}n0560 ;0565 *= $2000 loads here!0570 ;0575 ; Setup the program.0580 ;0585 START CLD clear decimal0590 59} JSR CLRTBL clear tables0595 JSR SETDL set display0600 JSR OPENKBD open keyboard0605 JMP STOPIT continue05:}610 ;0615 ; Input MUSIC COMPOSER files.0620 ;0625 DATAIN LDX #IOCB3 use IOCB #30630 LDA #NAME&$FF filename lo0635 5;} STA ICBAL,X buffer addr lo0640 LDA #NAME/256 filename hi0645 STA ICBAH,X buffer addr hi0650 JSR OPENIT open5<} file0655 BMI ERROR error?0660 LDA #READ get characters0665 STA ICCOM,X command byte0670 LDA #BUFF&$F5=}F read buffer lo0675 STA ICBAL,X buffer addr lo0680 LDA #BUFF/256 read buffer hi0685 STA ICBAH,X buffer addr h5>}i0690 LDA #BUFS&$FF read len lo0695 STA ICBLL,X buffer len lo0700 LDA #BUFS/256 read len hi0705 STA ICBLH5?},X buffer len hi0710 JSR CIOV read music data0715 CPY #EOF end of file?0720 BNE ERROR yes.0725 CLOSEI5@}T LDA #CLOSE close cmd0730 STA ICCOM,X command byte0735 JMP CIOV close file0740 ;0745 ; Input/output error han5A}dler.0750 ;0755 ERROR STY FR0 save error code0760 JSR BELL ring bell0765 LDX #ETX&$FF I/O err msg lo0770 5B} LDY #ETX/256 I/O err msg hi0775 JSR CURNT2 print msg+code0780 LDX #IOCB3 use IOCB 30785 JSR CLOSEIT close 5C}file0790 PLA pull two byte0795 PLA return address0800 JMP CHOICE choose option0805 ;0810 ; 5D}Read through data and find0815 ; PHRASE data,VOICE data, and0820 ; MISCELLANEOUS data and store0825 ; location in table.05E}830 ;0835 POINTERS LDA #0 get zero0840 STA PTR index lo0845 LDY #BUFF/256 buff addr hi0850 STY PTR+1 in5F}dex hi0855 TAY set Y to zero0860 SET1 LDA (PTR),Y get byte0865 CMP #170 header byte?0870 BNE SET2 5G} no.0875 INY increment index0880 BNE WHICH1 overflow?0885 INC PTR+1 yes, inc high0890 WHICH1 LDA5H} (PTR),Y get byte0895 BMI MISC misc. record?0900 TAX use as index0905 STY TABLE,X save address09105I} LDA PTR+1 of record in0915 STA TABLE+1,X table0920 JMP ENDMARK continue0925 MISC LDA #3 offset by 30935J}0 STA PTR bytes in index0935 LDA (PTR),Y get tempo0940 ASL A times 20945 ASL A times 40955K}0 ASL A times 80955 STA TEMPO save tempo0960 LDA #0 get zero to0965 STA PTR reset index05L}970 ENDMARK INY inc index0975 BNE END1 overflow?0980 INC PTR+1 yes. inc hi0985 END1 LDA (PTR),Y get byte5M}0990 CMP #255 end of record?0995 BEQ SET2 yes.1000 INY inc index1005 BNE ENDMARK overflow?15N}010 INC PTR+1 yes. inc hi1015 JMP ENDMARK continue1020 SET2 INY inc index1025 BNE SET3 overflow?15O}030 INC PTR+1 yes. inc hi1035 SET3 LDA (PTR),Y get byte1040 CMP #255 end of file?1045 BNE SET1 no.1055P}0 ;1055 ; Transfer the VOICE records1060 ; to storage areas set aside.1065 ;1070 LDX #6 set counter1075 TR1 LDA5Q} TRVTBL,X voice addr lo1080 STA TMP2 index lo1085 LDA #VC1/256 voice addr hi1090 STA TMP2+1 index hi1095 5R} LDA #255 end of rec flag1100 LDY #1 record offset1105 STA (TMP2),Y init record1110 DEY zer5S}o Y register1115 LDA TABLE+20,X voice rec lo1120 STA PTR index lo1125 LDA TABLE+21,X voice rec hi1130 5T} STA PTR+1 index hi1135 BEQ TRN empty voice rec1140 TR2 LDA (PTR),Y put voice byte1145 STA (TMP2),Y in voice5U} buf1150 INY inc index1155 LDA (PTR),Y put 2nd byte1160 STA (TMP2),Y in voice buf1165 INY 5V} inc index1170 CMP #255 end of voice?1175 BNE TR2 no.1180 TRN DEX yes. dec count1185 DEX 5W} index by 21190 BPL TR1 all voices?1195 RTS yes. continue1200 ;1205 TRVTBL .WORD VC1,VC2 voice addr5X}1210 .WORD VC3,VC4 table1215 ;1220 ; Erase old table before input.1225 ;1230 CLRTBL LDX #27 init index1235 LDA5Y} #0 get zero1240 CT1 STA TABLE,X store table1245 DEX dec index1250 BPL CT1 done?1255 RTS 5Z} yes. continue1260 ;1265 ; Check to see if a VOICE1270 ; needs a new record.1275 ;1280 NEEDREC LDX #3 init index125[}85 LDA #6 init voice index1290 STA XSTORE save voice index1295 NEXTREC LDA STATUS,X active?1300 BEQ INCX5\} no.1305 CMP #2 need voice rec?1310 BNE GETREC yes.1315 JMP PLAYIT play note1320 ;1325 ; Get a new5]} VOICE record1330 ; and process the info.1335 ;1340 GETREC JSR FINDREC record byte1345 CMP #7 valid commands?135^}50 BCS STATUS1 no. end voice1355 TAY make index1360 LDA JMPTBL,Y jmp addr lo1365 STA TMP2 jmp p5_}ointer lo1370 LDA JMPTBH,Y jmp addr hi1375 STA TMP2+1 jmp pointer hi1380 JSR FINDREC operand byte1385 JM5`}P (TMP2) go to it1390 ;1395 JMPTBL .BYTE NEXTREC&$FF,GOTO1&$FF1400 .BYTE PLAY1&$FF,TRANS1&$FF1405 .BYTE VOLUME1&5a}$FF,NEXTREC&$FF1410 .BYTE COUNT1&$FF1415 JMPTBH .BYTE NEXTREC/256,GOTO1/2561420 .BYTE PLAY1/256,TRANS1/2561425 5b} .BYTE VOLUME1/256,NEXTREC/2561430 .BYTE COUNT1/2561435 ;1440 ; Clear status.1445 ;1450 STATUS1 LDA #0 get zero145c}55 STA STATUS,X stop voice1460 ;1465 ; Increment to next VOICE.1470 ;1475 INCX DEX dec index1480 TXA 5d} put in Acc1485 ASL A times 21490 STA XSTORE voice index1495 BPL NEXTREC done yet?1500 RTS 5e} yes. continue1505 ;1510 ; Lookup next VOICE command1515 ; in VOICE storage area.1520 ;1525 FINDREC INC VCOUNT,X voic5f}e cnt1530 LDA FTBL,X voice addr lo1535 STA PTR index lo1540 LDA #VC1/256 voice addr hi1545 STA PTR+15g} index hi1550 LDY VCOUNT,X voice count1555 LDA (PTR),Y get byte1560 RTS continue1565 ;1570 FTBL .B5q}BJDOS SYSB NRECOVERYBASBYBOUNCE BASBjBTRAIN5 BASBlBTRAIN7 BASBnBTRAIN8 BASBpBTRAIN10BASBrBTRAIN12BASBvBTRAIN13BASBszKNIGHTS BASB.SYNMAIN BASBSYNCASS LSTBSYNDISK LSTB!SYN ASMB8;ALTKBD1 ASMBEsALTKBD2 ASMALTKBD3 BASYTE VC1&$FF voice table1575 .BYTE VC2&$FF1580 .BYTE VC3&$FF1585 .BYTE VC4&$FF1590 ;1595 ; If VOICE record is5r} a GOTO1600 ; then process the jump.1605 ;1610 GOTO1 SEC set carry1615 SBC #1 subtract 11620 ASL A 5s} multiply by 21625 DEC LINECNT,X dec linecount1630 BEQ NEXTREC done? yes.1635 STA VCOUNT,X point to line165t}40 JMP NEXTREC get next record1645 ;1650 ; Set sound parameters for1655 ; PHRASE number and set index to1660 ; PHRASE5u}'s location in memory.1665 ;1670 PLAY1 TAY use as index1675 LDA PATTACK,Y attack shadow1680 STA ATTACK,X at5v}tack count1685 LDA PDECAY,Y decay shadow1690 STA DECAY,X decay count1695 LDA PDROP,Y min vol shadow1700 S5w}TA DROP,X min vol value1705 LDA PVRANG,Y f-range shadow1710 STA VRANGE,X freq. range1715 LDA PVSPEED,Y speed 5x}shadow1720 STA VSPEED,X vibrato speed1725 TYA index to Acc1730 ASL A multiply by 21735 TAY 5y} to index again1740 LDA #1 get one1745 STA STATUS,X get rec status1750 STA GETNOTE,X need a note15z}755 LDA TABLE,Y phrase addr lo1760 STA PTRL,X phrase tbl lo1765 LDA TABLE+1,Y phrase addr hi1770 STA PTRH5{},X phrase tbl hi1775 BEQ PLAY2 data in table?1780 INC STATUS,X yes. play it1785 PLAY2 JMP NEXTREC get next rec5|}1790 ;1795 ; Set volume.1800 ;1805 VOLUME1 ASL A times 21810 ORA #$A0 pure tone1815 STA HIGHVOL,X save it15}}820 JMP NEXTREC get next rec1825 ;1830 ; Store the PHRASE count.1835 ;1840 COUNT1 STA LINECNT,X save count1845 J5~}MP NEXTREC get next rec1850 ;1855 ; Do transposition.1860 ;1865 TRANS1 STA TRANSPOS,X transpose1870 JMP NEXTREC get 5}next rec1875 ;1880 ; Iinitialize screen.1885 ;1890 SETDL LDA #DLIST&$FF display lo1895 STA SDLSTL DL pointer lo1905}0 LDA #DLIST/256 display hi1905 STA SDLSTL+1 DL pointer hi1910 LDA #$62 dark blue1915 STA COLBK backg5}round1920 RTS continue1925 ;1930 ; Get new file.1935 ;1940 RETRIEVE JSR DEFAULT do defaults1945 JSR CLR5}TBL clear table1950 JSR NAMEIT get filename1955 JSR DATAIN read data1960 JSR POINTERS set pointers1965 5} JMP NMBR1 back to menu1970 ;1975 ; Get user input from keyboard.1980 ;1985 CHOICE JSR GETKEY get character1990 PH5}A push value1995 JSR ERASE erase window2000 PLA pull value2005 CMP #'L play the music?25}010 BEQ LISTEN yes.2015 CMP #'R load file?2020 BEQ RETRIEVE yes.2025 CMP #'N repeat count?2030 5} BEQ NUMBER yes.2035 CMP #'P phrase change?2040 BEQ CPHRASE yes.2045 CMP #'T tempo change?2050 5} BEQ CTEMPO yes.2055 JSR BELL ring bell2060 JMP CHOICE try again2065 ;2070 ; LISTEN to the music.2075 ;2085}0 LISTEN LDA TABLE+21 OR together2085 ORA TABLE+23 high bytes of2090 ORA TABLE+25 voice pointers2095 ORA TABLE5}+27 to see if any2100 BNE LIS1 are active?2105 JMP NODATA no.2110 LIS1 LDX #QTX&$FF play msg lo2115 LDY #5}QTX/256 play msg hi2120 JSR PRINTD print msg2125 JSR PDEFAULT set defaults2130 PLAYING JSR NEEDREC voice rec21355} JSR DELAY synthesizer2140 JSR BRKCHK break key?2145 JMP FINISHED all done?2150 ;2155 ; Store # times to r5}epeat music.2160 ;2165 NUMBER LDX #NMTX&$FF number msg lo2170 LDY #NMTX/256 number msg hi2175 JSR PRINTD print m5}sg2180 JSR GETNUM get number2185 BPL NMBR0 range error?2190 NMBRE JSR RINGER yes. ring bell2195 JMP NUMBER5} try again2200 NMBR0 BNE NMBR1 return?2205 TAX no. put in X2210 BEQ NMBRE value zero?2215 DEX 5} no. 1-2552220 STX REPEAT store 0-2542225 NMBR1 JSR ERASE erase window2230 JMP CHOICE goto menu2235 ;2240 ;5} Change TEMPO of playback.2245 ;2250 CTEMPO LDA TEMPO get tempo2255 JSR CURRENT print it2260 LDX #TTX&$FF tempo m5}sg lo2265 LDY #TTX/256 tempo msg hi2270 JSR TXNUM ? msg / get num2275 BPL TEM1 numeric error?2280 TEME J5}SR RINGER yes. ring bell2285 JMP CTEMPO try again2290 TEM1 BNE NMBR1 return?2295 TAX no.2300 BEQ TE5}ME zero value?2305 STA TEMPO no. 1-2552310 JMP NMBR1 continue2315 ;2320 ; Change parameters of2325 ; soun5}d for one phrase.2330 ;2335 CPHRASE LDX #PTX&$FF phrase msg lo2340 LDY #PTX/256 phrase msg hi2345 JSR TXNUM pri5}nt/get num2350 BNE NMBR1 return?2355 CMP #10 no. >9?2360 BCC C1C no.2365 C1E JSR RINGER ring bell5}2370 JMP CPHRASE try again2375 C1C TAX test zero flag2380 BEQ C1E num = zero?2385 STA XSTORE no. 5}save number2390 ASL A times 22395 TAY use as index2400 LDA TABLE+1,Y phrase addr hi2405 BNE5} C3 active phrase?2410 JMP NODATA no.2415 C3 JSR ERASE erase window2420 LDX XSTORE get phrase #2425 5} LDA PATTACK,X attack value2430 JSR CURRENT print it2435 LDX #ATX&$FF attack msg lo2440 LDY #ATX/256 attack ms5}g hi2445 JSR TXNUM print/get num2450 BPL C3A numeric error?2455 C3E JSR BELL no. ring bell2460 JMP C5}3 try again2465 C3A BNE C5A return?2470 TAX no. test zero2475 BEQ C3E zero value?2480 LD5}X XSTORE no. get index2485 STA PATTACK,X save attack2490 C5A JSR ERASE erase window2495 LDX XSTORE get index25}500 LDA PDECAY,X decay value2505 JSR CURRENT print it2510 LDX #DTX&$FF decay msg lo2515 LDY #DTX/256 decay5} msg hi2520 JSR TXNUM print/get num2525 BPL C5B numeric error?2530 C5E JSR BELL yes. ring bell2535 J5}MP C5A try again2540 C5B BNE C6A return?2545 TAX no. test zero2550 BEQ C5E zero?2555 LDX 5}XSTORE no. get index2560 STA PDECAY,X new decay2565 C6A JSR ERASE erase window2570 LDX XSTORE get index2575 5} LDA #$AE maximum volume2580 SEC set carry flag2585 SBC PDROP,X sub min volume2590 LSR A 0.5}.14 => 0..72595 JSR CURRENT print it2600 LDX #VTX&$FF v.drop msg lo2605 LDY #VTX/256 v.drop msg hi2610 JS5}R TXNUM print/get num2615 BMI C6E numeric error?2620 BNE C8A no. return?2625 CMP #8 no. >7?2635}0 BCC C8C no. continue2635 C6E JSR BELL yes. ring bell2640 JMP C6A try again2645 C8C ASL A multip5}ly by 22650 STA TMP use later2655 LDA #$AE maximum volume2660 SEC set carry2665 SBC TMP 5} subtract drop2670 LDX XSTORE get index2675 STA PDROP,X minimum volume2680 C8A JSR ERASE erase window2685 5} LDX XSTORE get index2690 LDA PVRANG,X vibrato range2695 JSR CURRENT print it2700 LDX #RTX&$FF v.range msg lo5}2705 LDY #RTX/256 v.range msg hi2710 JSR TXNUM print/get num2715 BPL C8B numeric error?2720 JSR BEL5}L yes. ring bell2725 JMP C8A try again2730 C8B BNE C10A return?2735 LDX XSTORE no. get index2740 S5}TA PVRANG,X vibrato range2745 C10A JSR ERASE erase window2750 LDX XSTORE get index2755 LDA PVSPEED,X vibrato spe5}ed2760 JSR CURRENT print it2765 LDX #STX&$FF v.speed msg lo2770 LDY #STX/256 v.speed msg hi2775 JSR TXNUM5} print/get num2780 BPL C10B numeric error?2785 C10E JSR BELL yes. ring bell2790 JMP C10A try again2795 5}C10B BNE C11A return?2800 TAX no. test zero2805 BEQ C10E yes. error2810 LDX XSTORE get index2815}5 STA PVSPEED,X vibrato speed2820 C11A JMP NMBR1 continue2825 ;2830 TXNUM JSR PRINTD print string2835 JMP GETNUM5} get number2840 ;2845 ; Play the notes.2850 ;2855 PLAYIT LDY XSTORE get index2860 LDA GETNOTE,X need note?2865 5} BNE NEWNOTE yes. get a note2870 DEC DURCNT,X dec note length2875 BEQ NOTEDONE note done? yes.2880 JMP INCX 5} another voice2885 NOTEDONE LDA TIED,X note tied?2890 BNE NEWNOTE yes. skip2895 STA AUDF1,Y poke ultrasonic2900 5} STA AUDC1,Y zero volume2905 NEWNOTE INC PTRL,X note pntr lo2910 BNE NW2 overflow? no.2915 INC PTRH,X note 5}pntr hi2920 NW2 LDA TIED,X note tied?2925 BNE NW3A yes. skip2930 LDA #1 attack token2935 STA SYNSTAT5},X set status2940 LDA ATTACK,X attack count2945 STA SYNCNT,X save count2950 LDA #$A2 starting volume2955 5} STA AUDC1,Y poke hardware2960 STA VOLNOW,X save volume2965 NW3A LDA #0 get zero2970 TAY set Y to ze5}ro2975 STA ACCID init accidental2980 STA VSTAT,X vibrato status2985 STA GETNOTE,X not any more2990 LDA 5}VSPEED,X vibrato speed2995 STA VIBCNT,X speed count3000 LDA PTRL,X phrase ptr lo3005 STA PTR save pointer5} lo3010 LDA PTRH,X phrase ptr hi3015 STA PTR+1 save pointer hi3020 LDA (PTR),Y get note3025 CMP #85 5} rest?3030 BNE NW3 no. skip3035 TYA Acc = 03040 STA SYNSTAT,X synthesizer off3045 LDY XSTORE5} get index3050 STA AUDC1,Y zero volume3055 JMP GETDURA get duration3060 NW3 CMP #86 Cf6?3065 BNE NW4 5} no. skip3070 LDA #36 C6 index3075 JMP NW40 get frequency3080 NW4 CMP #127 measure?3085 BNE NW5 5} no. skip3090 INC PTRL,X note pointer lo3095 BNE NEWNOTE overflow? no.3100 INC PTRH,X note pointer hi3105 5} JMP NEWNOTE get a new note3110 NW5 CMP #255 end of phrase?3115 BNE NW6 no. skip3120 LDA #0 get a ze5}ro3125 STA SYNSTAT,X synthesizer off3130 LDY XSTORE get index3135 STA AUDC1,Y zero volume3140 LDA #1 5} get voice token3145 STA STATUS,X set status3150 JMP NEXTREC next voice rec3155 NW6 LSR A divide by 23160 5} ROL ACCID carry into ACCID3165 LSR A divide by 43170 ROL ACCID carry into ACCID3175 LDY #0 5}init octave #3180 NW7 CMP #7 compare 0..73185 BCC NW8 in range? yes.3190 SBC #7 subtract 73195 5}INY inc octave #3200 JMP NW7 try again3205 NW8 PHA save note #3210 LDA OCTBL,Y octave offset35}215 STA NOTE save octave3220 PLA get note #3225 TAY use as index3230 LDA NOTBL,Y note o5}ffset3235 ADC NOTE add octave3240 LDY ACCID accidental3245 ADC ACTBL,Y accid offset3250 STA NOTE 5}save note3255 LDA TRANSPOS,X transpose3260 CMP #129 up/down point3265 BCS TRANSDN down?3270 ADC NOTE 5} add note3275 NW36 CMP #37 in range?3280 BCC NW40 no. skip3285 SBC #36 make in range3290 JMP NW36 5} try again3295 TRANSDN AND #$7F transpose3300 STA TMP save it3305 LDA NOTE get note3310 SBC TMP 5}transpose it3315 NW37 CMP #37 in range?3320 BCC NW40 yes. skip3325 ADC #36-1 make in range3330 JMP NW5}37 try again3335 ;3340 OCTBL .BYTE 0,12,24,36 octave table3345 ACTBL .BYTE 0,$FF,1 accidental table3350 NOTBL .BYTE 0,5}2,4,5 note table3355 .BYTE 7,9,113360 ;3365 NW40 TAY use as index3370 LDA NOTES,Y get actual note3375 5} STA VNOTE,X save it3380 LDY XSTORE get index3385 STA AUDF1,Y poke hardware3390 ;3395 ; Compute note duration.35}400 ;3405 GETDURA INC PTRL,X pointer tbl lo3410 BNE GDUR1 overflow?3415 INC PTRH,X yes.pointer hi3420 GDUR1 LD5}A PTRL,X pointer tbl lo3425 STA PTR pointer lo3430 LDA PTRH,X pointer tbl hi3435 STA PTR+1 pointer hi35}440 LDY #0 get zero3445 STY TIED,X zero tied flag3450 LDA (PTR),Y duration byte3455 ASL A minu5}s => carry3460 ROL TIED,X carry => 1=tied3465 LSR A rotate back3470 TAY use as index3475 L5}DA GDTBL-1,Y actual duration3480 STA DURCNT,X save it3485 JMP INCX next voice3490 ;3495 GDTBL .BYTE 4,6,8 dura5}tion table3500 .BYTE 12,16,243505 .BYTE 32,48,643510 .BYTE 96,128,1923515 ;3520 ; Erase text at screen botto5}m.3525 ;3530 ERASE LDX #39 40 bytes 0..393535 LDA #0 display blank3540 ERSC STA TX1,X store in window3545 5} DEX decrement index3550 BPL ERSC done?3555 RTS yes. continue3560 ;3565 ; If no data in memor5}y.3570 ;3575 NODATA JSR ERASE erase window3580 LDX #NTX&$FF no data msg lo3585 LDY #NTX/256 no data msg hi3590 5} JSR PRINTD print it3595 JMP CHOICE goto menu3600 ;3605 ; Add VIBRATO.3610 ;3615 VIBRATO LDX #3 init index36205} LDY #6 hardware index3625 VBRT DEC VIBCNT,X v.speed count3630 BNE VNXTX done? yes.3635 LDA VSTAT,X vib5}rato status3640 BEQ RAISE 0=raise pitch3645 LDA VNOTE,X get frequency3650 STA AUDF1,Y poke hardware3655 5} DEC VSTAT,X vstat=03660 JMP PUTVIB continue3665 RAISE LDA VNOTE,X get frequency3670 BEQ VNXTX 0=no sound3675 5} SEC set carry3680 SBC VRANGE,X sub vib range3685 STA AUDF1,Y poke hardware3690 INC VSTAT,X vstat=15}3695 PUTVIB LDA VSPEED,X vibrato speed3700 STA VIBCNT,X v.speed count3705 VNXTX DEY hardware index3710 DEY 5} do it twice3715 DEX dec index3720 BPL VBRT done? no.3725 RTS continue3730 ;3735 ;5} Print current sound value.3740 ;3745 CURRENT STA FR0 save value3750 LDX #CTX&$FF current msg lo3755 LDY #CTX/2565} current msg hi3760 CURNT2 JSR PRINTU print in top3765 STA FR0+1 zero in F.P. hi3770 JSR IFP INTEGER to F.P.5}3775 JSR FASC F.P. to ASCII3780 CLD clear decimal3785 LDY #$FF init index3790 PNUM INY i5}nc index3795 LDA (INBUFF),Y get ASCII3800 AND #$1F to display code3805 STA TX1+15,Y put msg window3810 5} LDA (INBUFF),Y get ASCII3815 BPL PNUM end of string3820 RTS yes. continue3825 ;3830 ; Add delay to cr5}eate TEMPO.3835 ;3840 DELAY LDA TEMPO music tempo3845 STA TMP save it3850 DEL LDA #4 do SYN 4 times3855 5} STA TMP2 save count3860 DEL1 LDY #48 delay loop cnt3865 DEL2 DEY dec count3870 BNE DEL2 done? no.3875}5 JSR SYN synthesizer3880 DEC TMP2 dec 4 times cnt3885 BNE DEL1 done? no.3890 JSR VIBRATO vibrat5}o effect3895 DEC TMP dec tempo value3900 BNE DEL done? no.3905 RTS continue3910 ;3915 ; Plug5} in default values.3920 ;3925 PDEFAULT JSR SHUTOFF zero sounds3930 STA AUDCTL zero audio ctrl3935 JSR SIOINV in5}it hardware3940 LDX #3 init index3945 LDY #6 init tbl index3950 DEF1 LDA #0 get zero3955 STA TI5}ED,X zero tied3960 STA PTRL,X phrase tbl lo3965 STA PTRH,X phrase tbl hi3970 STA SYNSTAT,X syn status3975 5} STA TRANSPOS,X transpose3980 STA LINECNT,X voice line3985 STA VCOUNT,X voice rpt cnt3990 LDA #1 get o5}ne3995 STA GETNOTE,X need new note4000 STA STATUS,X need new record4005 LDA #$AA define high vol4010 S5}TA HIGHVOL,X new high vol4015 LDA #$A0 current volume4020 STA VOLNOW,X new volnow4025 LDA TABLE+21,Y voice 5}tbl hi4030 BNE DEF2 active? yes.4035 STA STATUS,X shut off voice4040 DEF2 DEX dec index4045 DEY 5} dec table index4050 DEY do it twice4055 BPL DEF1 done? no.4060 RTS continue4065 ;4075}0 ; Check if all VOICEs are done.4075 ;4080 FINISHED LDA STATUS OR status4085 ORA STATUS+1 of all voices4090 ORA 5}STATUS+2 together. if4095 ORA STATUS+3 result <> 0,4100 BNE ALLP keep playing4105 LDA REPEAT play again?45}110 BEQ ALL3 no. end it4115 DEC REPEAT dec repeat val4120 JMP LISTEN play it again4125 ALL3 JSR ERASE er5}ase window4130 JSR SHUTOFF stop all sound4135 JMP CHOICE goto menu4140 ALLP JMP PLAYING cont playing4145 ;4150 5}; Stop all sound.4155 ;4160 SHUTOFF LDX #6 init index4165 LDA #0 zero sound val4170 SHUT STA AUDC1,X zero volum5}e4175 STA AUDF1,X zero frequency4180 DEX dec index4185 DEX do it again4190 BPL SHUT do5}ne? no.4195 RTS continue4200 ;4205 ; Check if the BREAK key4210 ; has been pushed.4215 ;4220 BRKCHK LDA BRK5}KEY get break key4225 BNE BRKX key hit? no.4230 STOPIT DEC BRKKEY reset break4235 JSR SHUTOFF turn off sound425}40 STA REPEAT reset repeat4245 JSR ERASE erase window4250 JMP CHOICE goto menu4255 ;4260 ; Set sound valu5}es to default.4265 ;4270 DEFAULT LDX #9 do ten phrases4275 SYND LDA #64 default4280 STA PDECAY,X decay4285 S5}TA PVSPEED,X vibrato speed4290 LDA #1 default4295 STA PATTACK,X attack4300 LDA #0 default4305 S5}TA PVRANG,X vibrato range4310 LDA #$A2 default4315 STA PDROP,X minimum volume4320 DEX dec index4325}5 BPL SYND done? no.4330 BRKX RTS continue4335 ;4340 ; Input and print a number.4345 ;4350 GETNUM LDA #0 5} get zero4355 STA TMP save as pointer4360 DEC TX2+15 cursor $FF4365 GN1 JSR GETKEY get a letter4370 CMP5} #RETURN is it a return4375 BEQ GN3 yes. goto exit4380 CMP #BACKS backspace?4385 BNE GN2 no. goto GN25}4390 LDA TMP get pointer4395 BEQ GN1 left margin=0?4400 DEC TMP dec pointer4405 LDX TMP u5}se as index4410 LDA #$FF cursor char4415 STA TX2+15,X put cursor4420 INC TX2+16,X make space4425 JMP G5}N1 get a char4430 GN2 LDX TMP get pointer4435 CPX #3 three digits?4440 BEQ GN1 yes. try again4445}5 CMP #'0 .LT. ASCII 0?4450 BCC GN1 yes. try again4455 CMP #'9+1 .GT. ASCII 9?4460 BCS GN1 y6}es. try again4465 LDX TMP get index4470 STA NMBUF,X put in buffer4475 SBC #32-1 display code4480 ST6}A TX2+15,X put in window4485 LDA #$FF cursor char4490 STA TX2+16,X put cursor4495 INC TMP inc position6}4500 JMP GN1 get a char4505 GN3 LDX TMP get pointer4510 BNE GN4 any characters?4515 INC TMP no6}. set <>zero4520 RTS continue4525 GN4 LDA #NMBUF&$FF buffer adr lo4530 STA INBUFF inbuff pntr lo4535 6} LDA #NMBUF/256 buffer adr hi4540 STA INBUFF+1 inbuff pntr hi4545 LDA #0 non numeric4550 STA NMBUF,X numb6}er +14555 STA CIX FP offset4560 JSR AFP ASCII to F.P.4565 JSR FPI F.P. to INTEGER4570 CLD 6} clear decimal4575 LDA FR0 get value4580 LDX FR0+1 test >2554585 BEQ GN5 no. ok.4590 LDX #$6}80 set minus flag4595 GN5 RTS continue4600 ;4605 ; Name the INPUT device.4610 ;4615 NAMEIT LDX #ITX&$FF devic6}e msg lo4620 LDY #ITX/256 device msg hi4625 JSR PRINTU print it4630 STA TMP init index4635 DEC TX2 6 } init cursor $FF4640 NMT1 JSR GETKEY get character4645 LDX TMP get index4650 CMP #BACKS backspace?4655 6 } BNE NMT2 no. on screen4660 NMTD TXA yes. test index4665 BEQ NMT1 left margin=0?4670 DEC TMP posi6 }tion left4675 LDA #$FF get cursor4680 STA TX2-1,X put screen4685 INC TX2,X turn off cursor4690 JMP N6 }MT1 try again4695 NMT2 STA NAME,X ascii name buf4700 CMP #RETURN return key?4705 BEQ NMT5 yes. goto NMT54716 }0 SEC set carry4715 SBC #32 display code4720 STA TX2,X put screen4725 LDA #$FF get cursor6}4730 STA TX2+1,X put screen4735 INC TMP inc index sav4740 INX inc index4745 CPX #17 18 ch6}ar yet?4750 BNE NMT1 no. get more4755 JMP NMTD delete last4760 NMT5 INC TX2,X delete cursor4765 RTS 6} continue4770 ;4775 ; Controls operation of4780 ; the SYNTHESIZER section,4785 ; attack and decay.4790 ;4795 SYN L6}DX #3 init index4800 LDY #6 hardware index4805 SYN2 LDA SYNSTAT,X voice active?4810 BEQ NXTX no. do a6}nother4815 DEC SYNCNT,X syn dur count4820 BNE NXTX count done? no.4825 CMP #1 do attack?4830 BEQ 6}ATTCK yes.4835 CMP #2 do decay?4840 BEQ DECY yes.4845 JMP NXTX next voice4850 ATTCK INC VOLNOW,X6} inc volume4855 LDA VOLNOW,X current volume4860 STA AUDC1,Y poke hardware4865 CMP HIGHVOL,X at maximum?4870 6} BEQ GODECAY yes. now decay4875 LDA ATTACK,X attack duration4880 JMP DEC3 continue4885 GODECAY INC SYNSTAT,X 6}make decay4890 DEC2 LDA DECAY,X decay duration4895 DEC3 STA SYNCNT,X syn dur count4900 JMP NXTX next voice4905 DEC6}Y LDA VOLNOW,X current volume4910 CMP DROP,X compare low vol4915 BEQ GOSUSTN =low volume?4920 BCC GOSUSTN }or0180 MEMST = $74 ; Memory address where input starts0190 MAXLEN = $76 ; Maximum line length0200 CLKCTR = $77 ;:?} Click routine counter0210 CRSINH = $02F0 ; Cursor display inhibit0220 CH = $02FC ; Keyboard character code0230 PUTC:@}H = $0B ; CIO command for PUT CHARACTERS0240 ICCOM = $0342 ; CIO command byte0250 ICBLL = $0348 ; CIO buffer length:A} (low)0260 ICBLH = $0349 ; CIO buffer length (high)0270 CIOV = $E456 ; CIO entry point0280 LBUFF = $0580 ; Input re:B}sult buffer0290 CONSOL = $D01F ; Console switch port0300 INTATA = $FEFA ; Internal code to ATASCII table0310 ATASCI = $F:C}EFE ; Keycode to ATASCII table0320 *= $50000330 ;0340 KEYBD LDX #30350 KYB0 LDA MEMST,X ; Save $74 - $770360 P:D}HA 0370 DEX 0380 BPL KYB00390 LDA RMARGN ; Save RMARGN0400 PHA 0410 CMP #$27 ; If RMARGN = 39, d:E}on't increment it0420 BEQ NOINC0430 INC RMARGN ; Add 1 to RMARGN so cursor can0440 ; temporar:F}ily go there0450 NOINC LDA LMARGN ; Save LMARGN0460 PHA 0470 LDA CRSINH ; Save CRSINH0480 PHA 0490 LDA :G}COLCRS ; Set LMARGN to current 0500 STA LMARGN ; cursor location0510 LDA RMARGN0520 CLC ; Subtract (:H}LMARGN+1) to0530 SBC LMARGN ; compute and save maximum line0540 STA MAXLEN ; length for use as an index0550 :I}LDA OLDADR+1 ; Save starting memory0560 STA MEMST+1 ; address of input0570 LDA OLDADR0580 STA MEMST0590 L:J}DA #0 ; Ensure cursor on0600 STA CRSINH0610 STA ICBLL ; Set up CIO to PUT CHARACTERS0620 STA ICBLH ; :K}using single byte passed0630 LDA #PUTCH ; through the accumulator mode0640 STA ICCOM0650 BPL GTCHXF ; Get an:L} ATASCII character input0660 KYB1 CMP #$9C ; Shift/delete?0670 BEQ CLRLIN0680 CMP #$7D ; Shift/clear?0690 :M} BEQ CLRLIN0700 CMP #$FF ; Insert character?0710 BEQ CTLINS0720 CMP #$1F ; Cursor right?0730 BEQ C:N}RSRT0740 CMP #$9B ; If EOL, exit0750 BEQ EXIT0760 KYB2 LDX #0 ; IOCB index = 0 (Screen editor)0770 JSR:O} CIOV ; Put character on screen0780 LDA RMARGN ; If cursor position is beyond right0790 CMP COLCRS ; margin, m:P}ove cursor left0800 BNE GETCH ; Otherwise, get another character0810 LDA #$1E ; ATASCII cursor left0820 B:Q}PL KYB2 ; JMP KYB20830 CLRLIN LDY MAXLEN0840 LDA #00850 CL1 STA (MEMST),Y ; Clear line on screen0860 DEY 0870:R} BPL CL10880 STA OLDCHR ; Clear OLDCHR, or CIO will restore0890 LDA RMARGN ; it when cursor is moved0900 :S} STA COLCRS ; Reset cursor to beginning by0910 LDA #$1F ; setting cursor at right edge, then0920 BPL KYB2 ; :T}executing a cursor right0930 CTLINS LDY MAXLEN ; Is there a character0940 LDA (MEMST),Y ; at the right margin?0950 :U} BNE GETCH ; Yes, then don't do this0960 LDA #$FF ; No, do CTRL-INSERT0970 BMI KYB20980 CRSRT LDX #0 ; Do :V}cursor right0990 JSR CIOV1000 LDA COLCRS ; Did cursor end up1010 CMP RMARGN ; past right margin?1020 BN:W}E GETCH ; No, so get another character1030 LDA #$1F ; Yes, then reset cursor by doing1040 BPL CRSRT ; an add:X}itional cursor right1050 GTCHXF BPL GETCH ; JMP GETCH (transfer)1060 EXIT LDY MAXLEN ; Get characters from screen1070 EX1 :Y}LDA (MEMST),Y1080 PHA ; Save it temporarily1090 ROL A ; Convert from internal to ATASCII1100 ROL:Z} A1110 ROL A1120 ROL A1130 AND #31140 TAX 1150 PLA 1160 AND #$9F1170 ORA INTATA,X1180 :[} AND #$7F ; Mask off bit 7 in case cursor was1190 STA LBUFF,Y ; on top and store in buffer1200 DEY 1210 BPL:\} EX11220 LDY MAXLEN1230 EX2 LDA LBUFF,Y ; Put carriage return1240 CMP #$20 ; after first non-blank1250 BEQ:]} EX3 ; character encountered from1260 LDA #$9B ; the right1270 STA LBUFF+1,Y1280 BMI RETURN ; JMP RETU:^}RN1290 KYB1XF BCS KYB1 ; JMP KYB1 (transfer)1300 EX3 DEY 1310 BPL EX21320 RETURN PLA ; Restore CRSINH1330 S:_}TA CRSINH1340 PLA ; Restore LMARGN1350 STA LMARGN1360 PLA ; Restore RMARGN1370 STA RMARGN:`}1380 LDX #01390 RT1 PLA ; Restore $74 - $771400 STA MEMST,X1410 INX 1420 CPX #41430 BNE RT1:a}1440 RTS ; All done, return1450 GETCH LDA CH1460 CMP #$FF ; Key pressed?1470 BEQ GETCH ; No, kee:b}p trying1480 LDX #$FF ; Yes, clear CH1490 STX CH1500 CLICK LDY #$7F ; Keyboard click routine1510 STY CLKC:c}TR1520 CK1 LDY CLKCTR1530 STY CONSOL ; Turn speaker on/off1540 LDX #8 ; This number directly controls1550 D:d}ELAY DEX ; the click frequency1560 BPL DELAY ; Wait a while1570 DEC CLKCTR ; Then do it again1580 BPL:e} CK1 ; Only do it 128 times1590 CMP #$80 ; CTRL pressed?1600 BCC G2 ; No, then branch1610 LDX #3 :f} ; Check for exceptions to 'No1620 G1 CMP TABLE,X ; control characters'1630 BEQ G2 ; Branch if allowed excepti:g}on1640 DEX 1650 BPL G11660 BMI GETCH ; Not allowed, so get another1670 G2 LDX #8 ; Check for other ch:h}aracters1680 G3 CMP TABLE1,X ; that are not allowed1690 BEQ GETCH ; No good, go get another1700 DEX 1710 B:i}PL G31720 TAX ; Allowed, so get ATASCII equivalent1730 LDA ATASCI,X1740 CMP #$61 ; If its a lower c:j}ase letter1750 BCC G4 ; make it an upper case1760 CMP #$7B1770 BCS G41780 SEC 1790 SBC #$20180:k}0 G4 SEC 1810 BCS KYB1XF ; All done, return1820 ;1830 ;Control character exceptions: CURSOR LEFT,1840 ;CURSOR RIGHT:l}, CTRL-INSERT, CTRL-DELETE1850 TABLE .BYTE $86,$87,$B4,$B71860 ;Non-control character undesirables:1870 ;TAB,SHF/TAB,ESC,S:m}HF/ESC,ATARI,SHF/ATARI1880 ;SHF/INS,CAPS,SHF/CAPS1890 TABLE1 .BYTE $2C,$6C,$1C,$5C,$27,$67,$77,$3C,$7C1900 ;1910 ; DISABL:n}E BREAK KEY Subroutine1920 ;1930 POKMSK = $10 ; Pokey Mask (IRQEN shadow)1940 IRQEN = $D20E ; IRQ Enable1950 DISBRK :o}SEI ; Disable IRQs while messing with IRQEN1960 LDA POKMSK1970 AND #$7F ; Mask off BREAK key IRQ bit1980 :p} STA POKMSK ; Store back in shadow1990 STA IRQEN ; Store in hardware register2000 CLI ; Re-enable IRQs:q}2010 RTS 2020 ;2030 ; ENABLE BREAK KEY Subroutine2040 ;2050 ENBRK SEI 2060 LDA POKMSK2070 ORA #$802080 :r} STA POKMSK2090 STA IRQEN2100 CLI 2110 RTS 0 ;2050 ENBRK SEI 2060 LDA POKMSK2070 ORA #$802080 8<0100 ; **********************************0110 ; * ALTERNATIVE KEYBOARD HANDLER *0120 ; * (Basic Version) *>t}0130 ; **********************************0140 OFFST = $06EF ; Offset from String/Array area[2]0150 TEMP = $06F1 ; Te>u}mporary storage[2]0160 TABLE = $06F3 ; Table of allowed CTRL characters[4]0170 TABLE1 = $06F7 ; Table of ignored key pre>v}sses[8]0180 LMARGN = $52 ; Text column left margin0190 RMARGN = $53 ; Text column right margin value0200 COLCRS = $5>w}5 ; Column position of cursor0210 OLDCHR = $5D ; Character under cursor restore0220 OLDADR = $5E ; Memory address >x}of cursor[2]0230 MEMST = $74 ; Memory address where input starts[2]0240 STGVAR = MEMST ; String variable address[2]02>y}50 MAXLEN = $76 ; Maximum line length0260 CLKCTR = $77 ; Click routine counter0270 VVTP = $86 ; Variable Value T>z}able Pointer0280 STARP = $8C ; String/Array area Pointer0290 CRSINH = $02F0 ; Cursor display inhibit flag0300 CH = >{} $02FC ; Keyboard char code0310 LBUFF = $0580 ; Input return buffer0320 PUTCH = $0B ; CIO command for PUT CHARACTER>|}S0330 ICCOM = $0342 ; CIO command byte0340 ICBLL = $0348 ; CIO buffer length (low)0350 ICBLH = $0349 ; CIO buffer le>}}ngth (high)0360 CIOV = $E456 ; CIO entry point0370 CONSOL = $D01F ; Console switch port0380 INTATA = $FEFA ; Internal>~} code to ATASCII table0390 ATASCI = $FEFE ; Keycode to ATASCII table0400 *= $50000410 PLA ; Discard0420>} PLA ; String variable address (high byte)0430 STA TEMP+1 ; Save it0440 PLA ; String variable >}address (low byte)0450 STA TEMP ; Save it0460 SEC 0470 SBC STARP ; Compute address's offset0480 STA >}OFFST ; from the string/array pointer0490 LDA TEMP+1 ; and save it for later0500 SBC STARP+10510 STA OFFST+>}10520 KEYBD LDX #30530 KYB0 LDA MEMST,X ; Save $74 - $770540 PHA 0550 DEX 0560 BPL KYB00570 LDA RMARGN >} ; Save RMARGN0580 PHA 0590 CMP #39 ; If RMARGN = 39, don't increment it0600 BEQ NOINC0610 INC RMARGN>} ; Add 1 to RMARGN so cursor can0620 ; temporarily go there0630 NOINC LDA LMARGN ; Save LMARGN0640 >} PHA 0650 LDA CRSINH ; Save CRSINH0660 PHA 0670 LDA COLCRS ; Set LMARGN to current 0680 STA LMARGN ; >}cursor location0690 LDA RMARGN0700 CLC ; Subtract (LMARGN+1) to0710 SBC LMARGN ; compute and save max>}imum line0720 STA MAXLEN ; length for use as an index0730 LDA OLDADR+1 ; Save starting memory0740 STA MEMST+1>} ; address of input0750 LDA OLDADR0760 STA MEMST0770 LDA #0 ; Ensure cursor on0780 STA CRSINH0790 >} STA ICBLL ; Set up CIO to PUT CHARACTERS0800 STA ICBLH ; using single byte passed0810 LDA #PUTCH ; through >}the accumulator mode0820 STA ICCOM0830 BNE GTCHXF ; Get an ATASCII character input0840 KYB1 CMP #$9C ; Shift/de>}lete?0850 BEQ CLRLIN0860 CMP #$7D ; Shift/clear?0870 BEQ CLRLIN0880 CMP #$FF ; Insert character?08>}90 BEQ CTLINS0900 CMP #$1F ; Cursor right?0910 BEQ CRSRT0920 CMP #$9B ; If EOL, exit0930 BEQ EX>}IT0940 KYB2 LDX #0 ; IOCB index = 0 (Screen editor)0950 JSR CIOV ; Put character on screen0960 LDA RMARGN >}; If cursor position is beyond right0970 CMP COLCRS ; margin, move cursor left0980 BNE GTCHXF ; Otherwise, get an>}other character0990 LDA #$1E ; ATASCII cursor left1000 BPL KYB2 ; JMP KYB21010 CLRLIN LDY MAXLEN1020 LD>}A #01030 CL1 STA (MEMST),Y ; Clear line on screen1040 DEY 1050 BPL CL11060 STA OLDCHR ; Clear OLDCHR, or CIO>} will restore1070 LDA RMARGN ; it when cursor is moved1080 STA COLCRS ; Reset cursor to beginning by1090 LDA>} #$1F ; setting cursor at right edge, then1100 BPL KYB2 ; executing a cursor right1110 CTLINS LDY MAXLEN ; Is the>}re a character1120 LDA (MEMST),Y ; at the right margin?1130 BNE GTCHXF ; Yes, then don't do this1140 LDA #$FF>} ; No, do CTRL-INSERT1150 BMI KYB21160 CRSRT LDX #0 ; Do cursor right1170 JSR CIOV1180 LDA COLCRS ; Di>}d cursor end up1190 CMP RMARGN ; past right margin?1200 BNE GTCHXF ; No, so get another character1210 LDA #$>}1F ; Yes, then reset cursor by doing1220 BPL CRSRT ; an additional cursor right1230 EXIT LDY MAXLEN ; Get characte>}rs from screen1240 EX1 LDA (MEMST),Y1250 PHA ; Save it temporarily1260 ROL A ; Convert from internal>} to ATASCII1270 ROL A1280 ROL A1290 ROL A1300 AND #31310 TAX 1320 PLA 1330 AND #$9F1340 >} ORA INTATA,X1350 AND #$7F ; Mask off bit 7 in case cursor was1360 STA LBUFF,Y ; on top and store in buffer13>}70 DEY 1380 BPL EX11390 BMI COPY1400 KYB1T1 BCS KYB1 ; JMP KYB11410 GTCHXF BNE GETCH ; JMP GETCH1420 COPY LD>}A TEMP ; Move string variable address1430 STA STGVAR ; from temporary storage1440 LDA TEMP+1 ; to page zero for>} copy1450 STA STGVAR+11460 LDY MAXLEN1470 EX2 LDA LBUFF,Y ; Copy LBUFF to string variable1480 STA (STGVAR),Y>}1490 DEY 1500 BPL EX21510 LDY MAXLEN ; Get length of string input1520 EX3 LDA LBUFF,Y1530 CMP #$201540 >} BNE EX41550 DEY 1560 BPL EX31570 EX4 INY 1580 TYA ; Save it1590 PHA 1600 LDX #0 ; >}Find location where BASIC keeps1610 LDY #0 ; track of this string's current length1620 EX5 LDA (VVTP),Y ; Table en>}try 1 = $81?1630 BPL EX6 ; No, branch - not a string variable1640 INY 1650 INY 1660 LDA (VVTP),Y ; Ta>}ble entry 3 = low byte of1670 CMP OFFST ; string's address(by STARP offset)?1680 BNE EX6 ; No, branch - this >}isn't it1690 INY ; Yes, this is probably it, but check1700 LDA (VVTP),Y ; high byte to be sure1710 CMP>} OFFST+11720 BNE EX6 ; No match, lucky we checked - branch1730 INY ; A match! Just as we suspected1740>} PLA ; Retrieve string input length1750 STA (VVTP),Y ; and store it1760 BPL RETURN ; Continue with exi>}t routine1770 EX6 INX ; Set up to check next variable1780 TXA ; in Variable Value Table1790 ASL A >} ; Multiply variable number by 81800 ASL A ; to get index (8 entries per variable)1810 ASL A1820 TA>}Y ; Set up as index and try again1830 BNE EX5 ; Unconditional(essentially)1840 PLA ; Never foun>}d a match, so discard length1850 ; value and exit - this should never happen1860 RETURN PLA ; Restore CRSINH1870>} STA CRSINH1880 PLA ; Restore LMARGN1890 STA LMARGN1900 PLA ; Restore RMARGN1910 STA >}RMARGN1920 LDX #01930 RT1 PLA ; Restore $74 - $771940 STA MEMST,X1950 INX 1960 CPX #41970 B>}NE RT11980 RTS ; All done, return1990 KYB1T2 BCS KYB1T1 ; JMP KYB12000 GETCH LDA CH2010 CMP #$FF ; Key>} pressed?2020 BEQ GETCH ; No, keep trying2030 LDX #$FF ; Yes, clear CH2040 STX CH2050 CLICK LDY #$7F ; >}Keyboard click routine2060 STY CLKCTR2070 CK1 LDY CLKCTR2080 STY CONSOL ; Turn speaker on/off2090 LDX #8 >} ; This number directly controls2100 DELAY DEX ; the click frequency2110 BPL DELAY ; Wait a while2120 DEC>} CLKCTR ; Then do it again2130 BPL CK1 ; Only do it 128 times2140 CMP #$80 ; CTRL pressed?2150 BCC G2 >} ; No, then branch2160 LDX #3 ; Check for exceptions to 'No2170 G1 CMP TABLE,X ; control characters'2180 >} BEQ G2 ; Branch if allowed exception2190 DEX 2200 BPL G12210 BMI GETCH ; Not allowed, so get another2>}220 G2 LDX #8 ; Check for other characters2230 G3 CMP TABLE1,X ; that are not allowed2240 BEQ GETCH ; No good,>} go get another2250 DEX 2260 BPL G32270 TAX ; Allowed, so get ATASCII equivalent2280 LDA ATASCI,X>}2290 CMP #$61 ; If its a lower case letter2300 BCC G4 ; make it an upper case2310 CMP #$7B2320 BC>}S G42330 SEC 2340 SBC #$202350 G4 SEC 2360 BCS KYB1T2 ; All done, return2370 ;2380 ;Control character exc>}eptions: CURSOR LEFT,2390 ;CURSOR RIGHT, CTRL-INSERT, CTRL-DELETE2400 ;2410 ;Non-control character undesirables:2420 ;TAB>},SHF/TAB,ESC,SHF/ESC,ATARI,SHF/ATARI2430 ;SHF/INS,CAPS,SHF/CAPSE2400 ;2410 ;Non-control character undesirables:2420 ;TAB<A45.BKEYBDDISBRKENBRKABYTDLISTROWCRTXTROBOTSCB}@ d11;Ag,;@,;@,;@5,n--@")Ay%B}- x+-@@"'67,.>:,+ +-@@"'67,.>:,+ +-@Ag"'67B},.>:,+  * Legal control characters134,135,180,183* Illegal keycodes$$44,108,28,92,39,103,119,60,124B}* DISBRK$ DATA33104,120,165,16,41,127,133,16,141,14,210,88,96* ENBRK$ DATA22104,120,165,16,9,128,133,16,141B},14,210,88,96* KEYBD$ DATAZZ104,104,141,242,6,104,141,241,6,56,229,140,141,239,6,173,242,6,229,141,141,240,6,162B}VV3,181,116,72,202,16,250,165,83,72,201,39,240,2,230,83,165,82,72,173,240,2,72,165ZZ85,133,82,165,83,24,229,82,133,118,1B}65,95,133,117,165,94,133,116,169,0,141,240,2,141XX72,3,141,73,3,169,11,141,66,3,208,109,201,156,240,31,201,125,240,27,201B},255,240,42YY201,31,240,48,201,155,240,59,162,0,32,86,228,165,83,197,85,208,78,169,30,16,241,164"\\118,169,0,145,116,1B}36,16,251,133,93,165,83,133,85,169,31,16,222,164,118,177,116,208,49,ZZ169,255,48,212,162,0,32,86,228,165,85,197,83,208,34,B}169,31,16,241,164,118,177,116,726UU42,42,42,42,41,3,170,104,41,159,29,250,254,41,127,153,128,5,136,16,232,48,4,176@]]14B}7,208,98,173,241,6,133,116,173,242,6,133,117,164,118,185,128,5,145,116,136,16,248,164JXX118,185,128,5,201,32,208,3,136,16,B}246,200,152,72,162,0,160,0,177,134,16,23,200,200TZZ177,134,205,239,6,208,14,200,177,134,205,240,6,208,6,200,104,145,134,16B},9,232,138,10^[[10,10,168,208,221,104,104,141,240,2,104,133,82,104,133,83,162,0,104,149,116,232,224,4h``208,248,96,176,B}154,173,252,2,201,255,240,249,162,255,142,252,2,160,127,132,119,164,119,140rXX31,208,162,8,202,16,253,198,119,16,242,201,1B}28,144,12,162,3,221,243,6,240,5,202,16|\\248,48,210,162,8,221,247,6,240,203,202,16,248,170,189,254,254,201,97,144,7,201,12B}3,1763,56,233,32,56,176,180* START OF DEMO PROGRAM[ +'0@@A0@B}@@[0@@@%%6-F:A`,%AV$F:Aa,Find the Display List%@A0B}IISet Display List Interrupt bit on mode line halfway down the screen--@")A6%- B}Poke in DLI routine--72,169,244,141,10,212,141,24,208,104,64##Assembly Language equivalent:PHA ; SaveLDAB} #$F4 ; Brown STA WSYNC ; Wait for synch& STA COLPF2 ; Then store it0PLA ; Restore:RTI ; ReturnD'AB}'A@N33Display List Interrupt routine starts at $600XBBAbEnable DLIl B}TEST INPUT? v6-?:C:,,11Disable BREAK key before first handler call6-?:C:,